package cn.flying.base.process.service;

import java.util.List;
import java.util.Map;

import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.springframework.web.multipart.MultipartFile;

import cn.flying.base.process.enums.BizProcDefTypeEnum;


/**
 * @description: 工作流处理相关接口
 * @author: lvyong
 * @date: 2023年02月15日 20:50
 * @version: 1.0
 */
public interface FlowRuntimeService {
    /**
     * 获取流程引擎
     *
     * @return
     */
    ProcessEngine getProcessEngine();

    /**
     * 获取RepositoryService
     *
     * @return
     */
    RepositoryService getRepositoryService();

    /**
     * 获取IdentityService
     *
     * @return
     */
    IdentityService getIdentityService();

    /**
     * 获取ManagementService
     *
     * @return
     */
    ManagementService getManagementService();

    /**
     * 获取TaskService
     *
     * @return
     */
    TaskService getTaskService();

    /**
     * 获取RuntimeService
     *
     * @return
     */
    RuntimeService getRuntimeService();

    /**
     * 获取HistoryService
     *
     * @return
     */
    HistoryService getHistoryService();

    /**
     * 部署流程
     *
     * @param file
     * @param key
     * @param name
     * @return
     * @throws Exception
     */
    String deployment(MultipartFile file, String key, String name) throws Exception;

    /**
     * 启动流程
     *
     * @param bizKey
     * @param typeEnum
     * @param variables
     * @return
     */
    String startProcessByDefKey(String bizKey, BizProcDefTypeEnum typeEnum, Map<String, Object> variables);


    /**
     * 查询未分配代理人的任务（未领取）
     *
     * @return
     */
    List<Task> unClaimTask();

    /**
     * 领取任务
     *
     * @param taskId
     * @param userId
     */
    void claimTask(String taskId, String userId);

    /**
     * 查询我的待办任务
     *
     * @param assignee
     * @return
     */
    List<Task> unCompleteTasks(String assignee);

    /**
     * 完成提交任务
     *
     * @param taskId
     * @param variables
     */
    void completeTask(String taskId, Map<String, Object> variables);

    /**
     * 触发任务（争对Receive Task）
     *
     * @param bizKey
     * @param taskId
     */
    void triggerTask(String bizKey, String taskId);
}
